package gui.controller;

import gui.model.HeldenListCellRenderer;
import gui.view.MainPanel;
import helden.plugin.ausruestungsplugin.PluginHeldenAusruestungWerkzeug2;
import helden.plugin.werteplugin2.PluginHeld2;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import backend.DatenController;

public class MainController implements ListSelectionListener {
	
	private MainPanel dialog;
	
	private JFrame frame;
	
	private PluginHeld2[] helden;
	
	private PluginHeldenAusruestungWerkzeug2 phaw;
	
	private static MainController self;
	
	public MainController() {
		self = this;
	}
	
	public static MainController getInstance() {
		return self;
	}
	
	public MainController(JFrame frame, PluginHeld2[] helden, PluginHeldenAusruestungWerkzeug2 phaw) {

		this();
		this.frame = frame;
		this.helden = helden;
		this.phaw = phaw;
		this.dialog = new MainPanel(this.frame, this, new MenuController());
		addCloseAction();
		addSelectionListner();
		initLists();
		dialog.getJHeldenList().setCellRenderer(new HeldenListCellRenderer(28));
		dialog.getJItemSetsList().setCellRenderer(new HeldenListCellRenderer(28));
		this.dialog.setSize(820, 480);
		this.dialog.setLocationRelativeTo(frame);
		this.dialog.setVisible(true);
	}
	
	public void initLists() {

		// HeldenListfüllen
		DefaultListModel heldenModel = (DefaultListModel) dialog.getJHeldenList().getModel();
		heldenModel.removeAllElements();
		for (PluginHeld2 held : helden) {
			heldenModel.addElement(held);
		}
		// KlassenSetListfüllen
		DefaultListModel itemSetList = (DefaultListModel) dialog.getJItemSetsList().getModel();
		itemSetList.clear();
		for (String s : DatenController.getInstance().getAlleSetNamen()) {
			itemSetList.addElement(s);
		}
		// Fülle Sets Liste
		DefaultListModel model = (DefaultListModel) dialog.getJGegenstandsList().getModel();
		if (itemSetList.size() > 0) {
			dialog.getJItemSetsList().setSelectedIndex(0);
			String selectedItem = (String) dialog.getJItemSetsList().getSelectedValue();
			if (selectedItem != null) {
				model.removeAllElements();
				ArrayList<String> list = DatenController.getInstance().getKlassenItemList(
						selectedItem);
				for (String s : list) {
					model.addElement(s);
				}
				dialog.getJGegenstandsList().repaint();
				dialog.getJGegenstandsList().revalidate();
			}
		}
	}
	
	public void addKlassenSet() {

		new EditKlassenController(dialog, phaw, this);
	}
	
	public void editKlassenSet() {

		String selectedItem = (String) dialog.getJItemSetsList().getSelectedValue();
		if (selectedItem != null) {
			new EditKlassenController(dialog, phaw, this,
					selectedItem);
		} else {
			JOptionPane.showMessageDialog(dialog, "Kein Gegenstandsset ausgewählt!",
					"Nix ausgewählt", JOptionPane.WARNING_MESSAGE);
		}
	}
	
	public void addItemsZumHeld() {

		PluginHeld2 held = (PluginHeld2) dialog.getJHeldenList().getSelectedValue();
		if (held != null) {
			for (PluginHeld2 h : helden) {
				if (h.getHeldenID().equals(held.getHeldenID())) {
					held = h;
					break;
				}
			}
			phaw.setHeld(held);
			String selectedItem = (String) dialog.getJItemSetsList().getSelectedValue();
			if (selectedItem != null) {
				ArrayList<String> list = DatenController.getInstance().getKlassenItemList(
						selectedItem);
				for (String s : list) {
					phaw.hinzufuegenGegenstand(s);
				}
				JOptionPane.showMessageDialog(dialog, "Gegenstandsset erfolgreich hinzugefügt",
						"Erfolg", JOptionPane.INFORMATION_MESSAGE);
			} else {
				JOptionPane.showMessageDialog(dialog, "Kein Gegenstandsset ausgewählt!", "Fehler",
						JOptionPane.WARNING_MESSAGE);
			}
		} else {
			JOptionPane.showMessageDialog(dialog, "Kein Held ausgewählt!", "Fehler",
					JOptionPane.WARNING_MESSAGE);
		}
	}
	
	public void importVomHeld() {

		PluginHeld2 held = (PluginHeld2) dialog.getJHeldenList().getSelectedValue();
		if(held != null) {
		for (PluginHeld2 h : helden) {
			if (h.getHeldenID().equals(held.getHeldenID())) {
				held = h;
				break;
			}
		}
		String name = (String) JOptionPane.showInputDialog(frame,
				"Für die Gegenstände des Helden einen Setnamen angeben", "Setnamen",
				JOptionPane.PLAIN_MESSAGE, null, null, held.toString());
		while ((name == null) || (name.length() <= 0)
				|| DatenController.getInstance().isNameInBenutzung(name)) {
			name = (String) JOptionPane.showInputDialog(frame,
					"Für die Gegenstände des Helden einen Setnamen angeben \n"
							+ "Der Name darf noch nicht verwendet werden", "Setnamen",
					JOptionPane.PLAIN_MESSAGE, null, null, name);
		}
		phaw.setHeld(held);
		ArrayList<String> list = new ArrayList<String>();
		phaw.getAlleGegenstaende();
		for (String s : phaw.getHeldenInventarAlsString()) {
			if (phaw.isGegenstandBekannt(s)) {
				list.add(s);
			}
		}
		DatenController.getInstance().setKlassenItemList(name, list);
		initLists();
		JOptionPane.showMessageDialog(dialog, "Gegenstandsset erfolgreich importiert", "Erfolg",
				JOptionPane.INFORMATION_MESSAGE);
		}
		else {
			
			JOptionPane.showMessageDialog(dialog, "Kein Held wurde ausgewählt", "Fehler",
					JOptionPane.WARNING_MESSAGE);
		}
	}
	
	public void delKlassenSet() {

		String selectedItem = (String) dialog.getJItemSetsList().getSelectedValue();
		if (selectedItem != null) {
			int n = JOptionPane
					.showConfirmDialog(dialog, "Soll das Itemset " + selectedItem
							+ " wirklich gelöscht werden?", "Wirklich löschen?",
							JOptionPane.YES_NO_OPTION);
			if (n == JOptionPane.YES_OPTION) {
				DefaultListModel itemSetList = (DefaultListModel) dialog.getJItemSetsList()
						.getModel();
				itemSetList.removeElement(selectedItem);
				DatenController.getInstance().entferneItemSet(selectedItem);
				DefaultListModel model = (DefaultListModel) dialog.getJGegenstandsList()
						.getModel();
				model.clear();
				initLists();
			}
		} else {
			JOptionPane.showMessageDialog(dialog, "Kein Gegenstandsset ausgewählt!", "Fehler",
					JOptionPane.WARNING_MESSAGE);
		}
	}
	
	public void close() {

		DatenController.getInstance().speichern();
		dialog.dispose();
	}
	
	private void addSelectionListner() {

		DefaultListModel model = (DefaultListModel) dialog.getJGegenstandsList().getModel();
		model.clear();
		dialog.getJItemSetsList().addListSelectionListener(this);
	}
	
	/**
	 * @see javax.swing.event.ListSelectionListener#valueChanged(javax.swing.event.ListSelectionEvent)
	 */
	@Override
	public void valueChanged(ListSelectionEvent e) {

		String selectedItem = (String) dialog.getJItemSetsList().getSelectedValue();
		if (selectedItem != null) {
			DefaultListModel model = (DefaultListModel) dialog.getJGegenstandsList().getModel();
			model.clear();
			ArrayList<String> list = DatenController.getInstance()
					.getKlassenItemList(selectedItem);
			for (String s : list) {
				model.addElement(s);
			}
		}
	}
	
	private void addCloseAction() {

		dialog.addWindowListener(new WindowAdapter() {
			
			@Override
			public void windowClosing(WindowEvent e) {

				DatenController.getInstance().speichern();
				dialog.dispose();
			}
		});
	}
}